package com.masita.logica;

import java.sql.*;
import java.util.Vector;

import com.masita.util.Utilidad;

public class DetalleCompra {
	
	private int id_detalle;
	private int id_compra;
	private int id_producto;
	private int id_talle;
	private Producto producto;
	private int cantidad;
	private double precio_costo;
	
	public DetalleCompra(int id_det, int id_c, int id_prod, int id_t,
						 int cant, double costo){
		this.id_detalle = id_det;
		this.id_compra = id_c;
		this.id_producto = id_prod;
		this.id_talle = id_t;
		this.cantidad = cant;
		this.precio_costo = costo;
		this.producto = null;
	}

	// METODO GET DE LA CLASE ***************************** 	
	public int getCantidad(){
		return cantidad;
	}

	public int getIdDetalle(){
		return id_detalle;
	}

	public int getIdProducto(){
		return id_producto;
	}

	public int getIdTalle(){
		return id_talle;
	}

	public int getIdCompra(){
		return id_compra;
	}

	public double getPrecioCosto(){
		return precio_costo;
	}

	public Producto getProducto(){
		if( this.producto == null && this.id_producto != 0 )
			this.producto = Producto.getProducto(this.id_producto);
		return producto;
	}

	// METODO SET DE LA CLASE *****************************
	public void setCantidad(int i) {
		cantidad = i;
	}

	public void setIdProducto(int i){
		id_producto = i;
		this.producto = null;
	}

	public void setIdCompra(int i){
		id_compra = i;
	}

	public void setIdTalle(int i){
		id_talle = i;
	}

	public void setPrecioCosto(double d){
		precio_costo = d;
	}

	public void setProducto(Producto prod){
		if( prod != null )
			this.id_producto = prod.getIdProducto();
		this.producto = prod;
	}
	
	// METODO S ESTATICOS DE LA CLASE *********************
	public static Vector getDetallesCompra(int id_c){
		Vector detalles = null;
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM detalle_compra "+							   "WHERE id_compra = "+id_c;
			ResultSet rs = st.executeQuery(sentencia);
			while( rs.next() ){
				if( detalles == null ) detalles = new Vector();
				detalles.addElement(new DetalleCompra(rs.getInt("id_detalle"),
									rs.getInt("id_compra"),
									rs.getInt("id_producto"),
									rs.getInt("id_talle"),
									rs.getInt("cantidad"),
									rs.getDouble("precio_costo")));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		
		return detalles;
	}

	public static DetalleCompra getDetalleCompra(int id_d, int id_c){
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM detalle_compra " +							   "WHERE id_detalle = "+id_d+
							   " AND id_compra = "+id_c;
			ResultSet rs = st.executeQuery(sentencia);
			if( rs.next() ){
				return new DetalleCompra(rs.getInt("id_detalle"),
					   rs.getInt("id_compra"),rs.getInt("id_producto"),
					   rs.getInt("id_talle"),rs.getInt("cantidad"),
					   rs.getDouble("precio_costo"));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		
		return null;
	}
	
	public static Vector getDetallesPorProducto(int id_p, String fI, String fF){
		Vector detalles = null;

		String sentencia = null;
		if( fI == null ){
			sentencia = "SELECT detalle_compra.* FROM detalle_compra, compra WHERE id_producto = "+id_p+" AND "+				        "compra.id_compra = detalle_compra.id_compra AND fecha_compra <= '"+fF+"'";
		}
		else{
			sentencia = "SELECT detalle_compra.* FROM detalle_compra, compra WHERE id_producto = "+id_p+" AND "+
						"compra.id_compra = detalle_compra.id_compra AND fecha_compra <= '"+fF+"' "+	
						" AND fecha_compra >= '"+fI+"'";
		}
		try{
			Statement st = Conexion.getStatement();
			ResultSet rs = st.executeQuery(sentencia);
			while( rs.next() ){
				if( detalles == null ) detalles = new Vector();
				detalles.addElement(new DetalleCompra(rs.getInt("id_detalle"),
									rs.getInt("id_compra"),
									rs.getInt("id_producto"),
									rs.getInt("id_talle"),
									rs.getInt("cantidad"),
									rs.getDouble("precio_costo")));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		
		return detalles;
	}
	
	// CREAR DETALLE COMPRA DE PEDIDO *********************
	public static DetalleCompra crearDetalleDePedido(Pedido p){
		DetalleCompra detalle = new DetalleCompra(0,0,p.getIdProducto(),
								p.getIdTalle(),p.getCantidad(),
								p.getProducto().getPrecioCosto());
		
		return detalle;
	}
	
	// METODO GUARDARDATOS DE LA CLASE ********************
	public int guardarDatos(){
		try{
			Statement st = Conexion.getStatement();
			String sentencia;
			
			if( this.id_detalle == 0 ){
				sentencia = "INSERT INTO detalle_compra VALUES(0,"+
							this.id_compra+","+this.id_producto+","+
							this.id_talle+","+this.cantidad+","+
							this.precio_costo+")";
				st.executeUpdate(sentencia);
				ResultSet rs = st.getGeneratedKeys();
				if( rs.next() ) this.id_detalle = rs.getInt(1);
			}
			else{
				sentencia = "UPDATE detalle_compra SET" 
							+" id_producto = "+this.id_producto
							+", id_talle = "+this.id_talle
							+", cantidad = "+this.cantidad
							+", precio_costo = "+this.precio_costo
							+" WHERE id_detalle = "+this.id_detalle+" AND"
							+" id_compra = "+this.id_compra;
				st.executeUpdate(sentencia);				
			}			
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return this.id_detalle;
	}
	
	// METODO ELIMINAR DE LA CLASE ************************
	public boolean eliminar(){
		try{
			if( this.id_detalle == 0 ) return false;
			
			Statement st = Conexion.getStatement();
			String sentencia = "DELETE FROM detalle_compra " +
							   "WHERE id_detalle = "+this.id_detalle +
							   " AND id_compra = "+this.id_compra;
			st.executeUpdate(sentencia);
			this.id_detalle = 0;
						
			return true;
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return false;
	}
	
	//  METODO CALCULAR VALORES ***************************
	public double getMonto(){
		return Utilidad.getDoubleDos(this.precio_costo*this.cantidad);
	}
	
	// METODO REGISTRAR COMPRA ****************************
	public void registrarDetalle(){
		
		// ACTUALIZA EL STOCK DE LOS PRODUCTOS ********
		if( this.getProducto() != null ){
			TalleProducto talle = this.getProducto().getTalle(this.id_talle); 
			talle.addStock(this.cantidad);
			talle.guardarDatos();
		}
		
		this.guardarDatos();
	}
}